今天會繼續探討其他的 flask 的函式。如果說昨天的函式是用來給予使用者回應,那今天提到的函式就是比較偏向接收使用者的請求。
首先來看個小小的例子。
app.py
from flask import Flask
from utils import get_url_map
app = Flask(__name__)
@app.route("/")
def url_map():
get_url_map()
return ""
app.run(host="127.0.0.1", port=8080, debug=True)
utils.py
from flask import current_app
def get_url_map():
print(current_app.url_map)
在 app.py
中,我們 import 了另外一個 module 裡面的 get_url_map
函式,而該函式則呼叫了從 flask 引入的 current_app
,並 print 他的 url_map
。
這邊的重點就在該 current_app
,他會被設定成一開始在 app.py
宣告的 app
。要這麼做的原因在於我們無法直接從 app.py
引入我們設的 app
,因為這樣會導致 circular import,所以 flask 提供了這個方法讓我們可以在其他 module 中存取到 app
。
昨天有提到怎麼新增及刪除 cookie,但卻沒有提到如何讀取現在的 cookie,因為他需要用到的不是 resposne
,而是 request
,也就是在這個範例要講的概念。不例外地,先從一個範例看起。
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def index_page():
cookies = request.cookies
if request.method == "GET":
print(cookies["user"])
return "GET /"
if request.method == "POST":
return "POST /"
@app.route("/set")
def set_cookie():
response = make_response("")
response.set_cookie("user", "cat")
return response
app.run(host="127.0.0.1", port=8080, debug=True)
這裡面有兩個路徑,第二個跟昨天設定 cookie 是一樣的,比較有趣的是第一個。先看到 request
這個物件,他一樣需要先 import。它代表了現在 flask 收到的 request
,也就是說,在第一個路徑裡使用 request
和在第二個路徑裡使用會有不同的結果。
這個 request
內包含了很多資訊,這邊只挑兩個未來會用到的來說,分別是 request.cookies
及 request.method
,其餘的可以參考 flask.Request 或其原始碼。
request.cookies
就是昨天沒有說的「讀取 cookie」的部分,他基本上是一個不可修改的 dict,所以在下面我們使用 dict 的方式 (cookies["user"]
) 來存取這個 cookie 的值。request.method
是一個字串,就是存取的 HTTP method,以此路徑為例,只有 GET、POST 兩種可能 (在 app.route()
定義過了),所以在下方的判斷就只做這兩個。這個方式非常常用,基本上每一個路徑都會用到。除了上述這幾個之外,request.form
也很常用,顧名思義,他就是處理使用者提交的表單,但因為我們之後會使用 Flask-WTF,不會直接操作到他,所以暫時不提。
Get the data received in a Flask request